package org.lyc.lanqiao.bank;


import java.util.Scanner;

/**
 * 2.路径问题 https://www.lanqiao.cn/problems/89/learning/?page=1&first_category_id=1&name=%E8%B7%AF%E5%BE%84
 * 假设一个NxN的棋盘，从(1,1)出发，只能横向和竖向移动，但不能向最后到达(N,N)即结束。
 * 但是为了记录行动轨迹，每次行动完成后，对应的横坐标轴和纵坐标轴的数字就会+1
 * 如下所示:
 * 带*的数字即为走过的路径： (1,1)->(2,1)->(2,2)->(3,2)->(3,3)
 * 那么对应的x=1只途径过一次所以为1, x=2和3均经过两次所以为2, y轴亦然
 * ------1    2    2
 * -------------------
 * --2 | 0* | 1* | 2 |
 * -------------------
 * --2 | 3 | 4* | 5* |
 * -------------------
 * --1 | 6 | 7 | 8* |
 * -------------------
 * 那么如果已知x和y轴中所有的数字(如x轴为1,2,2;y轴为2,2,1),如何求出行动轨迹
 * 输入描述：第一行输入一个整数表示N；第二行输入N个整数表示x轴上各个数字存储的经过次数；第三行ze是y轴的。
 * 输入样例：如上图则应输入
 * 3
 * 1 2 2
 * 2 2 1
 * 输出样例：
 * 0 1 4 5 8
 *
 * @author Liu Yicong
 * @date 2024/1/26
 */
public class BTrackProblem {
	private static int[] path;
	private static int n;
	private static int[] cntx;
	private static int[] cnty;
	private static boolean[][] visited;
	private static boolean success;
	private static final int[] dx = {1, 0, -1, 0};//控制走的方向
	private static final int[] dy = {0, 1, 0, -1};

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();//n*n格子
		cntx = new int[n];
		cnty = new int[n];
		path = new int[n * n];
		visited = new boolean[n][n];
		sc.nextLine();
		for (int i = 0; i < n; i++) {
			cntx[i] = sc.nextInt();
			// tot += cntx[i];
		}
		for (int i = 0; i < n; i++) {
			cnty[i] = sc.nextInt();
			// tot += cnty[i];
		}
		dfs(0, 0, 0);

	}

	private static void dfs(int x, int y, int step) {
		path[step] = y * n + x; //将该点编号记录到路径中
		visited[x][y] = true;//将该点标记为已经走过的状态
		cntx[x]--;//拔掉对应的箭
		cnty[y]--;
		if (/*step+1==tot/2 && */x == n - 1 && y == n - 1 && check())//判断是否到达终点
		{
			success = true;
			for (int i = 0; i <= step; i++)//输出答案。
			{
				System.out.print(path[i] + " ");
			}
			return;
		}

		for (int i = 0; i < 4; i++)//上下左右四个方向搜索下一步
		{
			int xx = x + dx[i], yy = y + dy[i];
			if (!success && 0 <= xx && xx <= n - 1 && yy >= 0 && yy <= n - 1 && !visited[xx][yy])//没有到达终点，下一步(xx,yy)未走过且在地图范围内
			{
				if (cntx[xx] > 0 && cnty[yy] > 0)//该点对应箭靶上有箭，说明该点可以走
				{
					dfs(xx, yy, step + 1);//搜索下一步
					visited[xx][yy] = false;//复原，回溯
					cntx[xx]++;
					cnty[yy]++;
				}
			}
		}
	}

	private static boolean check() {
		for (int i = 0; i < n; ++i) {
			if (cntx[i] != 0 || cnty[i] != 0)
				return false;
		}
		return true;
	}
}
